package com.qf.controller;

import lombok.SneakyThrows;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Map;

@WebServlet("/otherUpload")
public class OtherUploadServlet extends HttpServlet {
    @SneakyThrows
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //1)通过ServletFileUpload 上传对象
        // 判断当前表单是否是多数据上传(不仅有普通表单:文本输入框/密码输入框/下列菜单,以及包含文件上传组件input type="file")
        boolean flag = ServletFileUpload.isMultipartContent(request) ;
        if(flag){
            //true:现在表单就包含input type="text"  input type="file"

            //2)创建一个磁盘工厂对象(存储每一个文件项)
            DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory() ;

            //3)创建上传文件对象
            ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory) ;

            //4)通过上传文件对象 解析 请求数据的内容(HttpServletRequest),获取所有的文件项列表
            List<FileItem> list = servletFileUpload.parseRequest(request);

            //5)遍历文件项列表
            for(FileItem fileItem :list){
                //判断fileItem文件项 到底是普通数据(普通表单数据)还是 文件上传组件的数据
                if(fileItem.isFormField()){
                    //是普通数据(普通表单数据)
                    //获取前端传递过来的普通表单数据的name属性的值   name="pname"
                    String fieldName = fileItem.getFieldName();
                    System.out.println(fieldName) ;
                    //文件项对象获取非文件类型的表单数据的内容
//                    String value = fileItem.getString(); //如果有中文乱码,需要解决乱码 重载方法
                    //String getString(String 字符集)
                    String value = fileItem.getString("utf-8");
                    System.out.println(fieldName+"---"+value);


                }else{
                    //文件上传的组件数据
                    String name = fileItem.getName(); //获取前端提交过来的 上传组件内容的名称 name="file"的内容
                    System.out.println("上传组件中的文件名称是:"+name) ;
                    //保存本地磁盘

                    //获取当前products文件夹的绝对路径
                    String realPath = request.getServletContext().getRealPath("/products");

                    //fileItem文件项对象写入到磁盘上
                    File file = new File(realPath+"/"+name) ;
                    fileItem.write(file);
                }
            }
            response.getWriter().write("恭喜您,上传完成!");
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        doGet(request,response);
    }
}
